﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpPickInterface.h"
#include "ContainerUtil.h"
#include "IObject.h"

namespace gcmp {

    class IGraphicsNodeReference;

    /// \brief 拾取候选项
    ///
    /// 拾取候选项是构成拾取候选集的基本单位
    /// 它也是更新选择集的基本单位。
    /// 每次点选或框选结束，当前拾取候选项便成了当前拾取结果，用于更新“选择集”或更新“仅用于高亮的选择集”。
    class GCMP_PICK_INTERFACE_EXPORT IPick : public IObject
    {
        DEFINE_CAST_DERIVED(IPick, IObject);
    public:

        /// \brief 创建空的拾取候选项
        /// \return  拾取候选项
        static OwnerPtr<IPick> Create();

        /// \brief 克隆拾取候选项
        /// \return 拾取候选项
        virtual OwnerPtr<IPick> Clone() const = 0;

        /// \brief 获得拾取候选项中最前面的图形节点引用
        /// \return 图形节点引用指针
        virtual const IGraphicsNodeReference* GetFront() const = 0;

        /// \brief 获得拾取候选项中的数据，即所有的图形节点引用
        /// \return 所有的图形节点引用
        virtual const std::vector<OwnerPtr<IGraphicsNodeReference>>& GetAllGraphicsNodeReferences() const = 0;

        /// \brief 获得拾取候选项中的数据，即所有的图形节点引用
        /// \return 所有的图形节点引用
        virtual std::vector<OwnerPtr<IGraphicsNodeReference>>& GetAllGraphicsNodeReferencesFw() = 0;

        /// \brief 向拾取候选项中添加图形节点
        /// \param graphicsNodeReference 添加的图形节点引用
        /// \return 增加成功返回true，失败返回false 
        virtual bool AddGraphicsNodeReference(const IGraphicsNodeReference& graphicsNodeReference) = 0;

        /// \brief 判断拾取候选项是否为空
        /// \return 返回true表示为空，false表示不为空
        virtual bool IsEmpty() const = 0;
    };

}// namespace gcmp

